/* 
 * File:   PilhaSeq.h
 * Author: André Balan
 *
 * Created on 19 de Janeiro de 2010, 13:49
 */


#ifndef _PilhaSeq_H
#define	_PilhaSeq_H


#include <iostream>
#include <stdexcept>

using std::logic_error;

namespace ED {

    template <typename Tipo>
    class PilhaSeq {
        public:
            PilhaSeq(int size);  // Construtor
            ~PilhaSeq();         // Destrutor

            // Métodos principais
            void empilha(const Tipo &elem) throw (logic_error);
            Tipo desempilha()        throw (logic_error);

            // Métodos auxiliares
            bool cheia();
            bool vazia();
        private:
            Tipo *vetor;
            int  topo, size;
    };


    //  Construtor
    template <class Tipo>
    PilhaSeq<Tipo>::PilhaSeq(int size) {
        this->size = size;
        vetor = new Tipo[size];
        topo = -1;
    }

    //  Destrutor
    template <class Tipo>
    PilhaSeq<Tipo>::~PilhaSeq() {
        delete [] vetor;
    }

    //  Empilha
    template <class Tipo>
    void PilhaSeq<Tipo>::empilha(const Tipo &el) throw (logic_error) {
        if (topo == (size-1)) throw logic_error("Pilha cheia\n");
        vetor[++topo] = el;
    }

    // Desempilha
    template <class Tipo>
    Tipo PilhaSeq<Tipo>::desempilha() throw (logic_error) {
        if (topo < 0)  throw logic_error("Pilha vazia\n");
        return(vetor[topo--]);
    }


    template <class Tipo>
    bool PilhaSeq<Tipo>::cheia() {
        return(topo == (size-1));
    }

    template <class Tipo>
    bool PilhaSeq<Tipo>::vazia() {
        return(topo <0);
    }

}

#endif	/* _PilhaSeq_H */

